home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2004 April / Gamestar_61_2004-04_dvdb.iso / DVDStar / Editace / hltp.exe / {app} / Source Code / Textures SDK / common / mathlib.c < prev    next >
C/C++ Source or Header  |  1998-12-02  |  5KB  |  244 lines

  1. /***
  2. *
  3. *    Copyright (c) 1998, Valve LLC. All rights reserved.
  4. *    
  5. *    This product contains software technology licensed from Id 
  6. *    Software, Inc. ("Id Technology").  Id Technology (c) 1996 Id Software, Inc. 
  7. *    All Rights Reserved.
  8. *
  9. ****/
  10.  
  11. // mathlib.c -- math primitives
  12.  
  13. #pragma warning( disable : 4244 )
  14. #pragma warning( disable : 4237 )
  15. #pragma warning( disable : 4305 )
  16.  
  17. #include "cmdlib.h"
  18. #include "mathlib.h"
  19.  
  20. vec3_t vec3_origin = {0,0,0};
  21.  
  22.  
  23. double VectorLength(vec3_t v)
  24. {
  25.     int        i;
  26.     double    length;
  27.     
  28.     length = 0;
  29.     for (i=0 ; i< 3 ; i++)
  30.         length += v[i]*v[i];
  31.     length = sqrt (length);        // FIXME
  32.  
  33.     return length;
  34. }
  35.  
  36.  
  37. void VectorTransform (const vec3_t in1, float in2[3][4], vec3_t out)
  38. {
  39.     out[0] = DotProduct(in1, in2[0]) + in2[0][3];
  40.     out[1] = DotProduct(in1, in2[1]) + in2[1][3];
  41.     out[2] = DotProduct(in1, in2[2]) + in2[2][3];
  42. }
  43.  
  44. qboolean VectorCompare (vec3_t v1, vec3_t v2)
  45. {
  46.     int        i;
  47.     
  48.     for (i=0 ; i<3 ; i++)
  49.         if (fabs(v1[i]-v2[i]) > EQUAL_EPSILON)
  50.             return false;
  51.             
  52.     return true;
  53. }
  54.  
  55. vec_t Q_rint (vec_t in)
  56. {
  57.     return floor (in + 0.5);
  58. }
  59.  
  60. void VectorMA (vec3_t va, double scale, vec3_t vb, vec3_t vc)
  61. {
  62.     vc[0] = va[0] + scale*vb[0];
  63.     vc[1] = va[1] + scale*vb[1];
  64.     vc[2] = va[2] + scale*vb[2];
  65. }
  66.  
  67. void CrossProduct (vec3_t v1, vec3_t v2, vec3_t cross)
  68. {
  69.     cross[0] = v1[1]*v2[2] - v1[2]*v2[1];
  70.     cross[1] = v1[2]*v2[0] - v1[0]*v2[2];
  71.     cross[2] = v1[0]*v2[1] - v1[1]*v2[0];
  72. }
  73.  
  74. vec_t _DotProduct (vec3_t v1, vec3_t v2)
  75. {
  76.     return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2];
  77. }
  78.  
  79. void _VectorSubtract (vec3_t va, vec3_t vb, vec3_t out)
  80. {
  81.     out[0] = va[0]-vb[0];
  82.     out[1] = va[1]-vb[1];
  83.     out[2] = va[2]-vb[2];
  84. }
  85.  
  86. void _VectorAdd (vec3_t va, vec3_t vb, vec3_t out)
  87. {
  88.     out[0] = va[0]+vb[0];
  89.     out[1] = va[1]+vb[1];
  90.     out[2] = va[2]+vb[2];
  91. }
  92.  
  93. void _VectorCopy (vec3_t in, vec3_t out)
  94. {
  95.     out[0] = in[0];
  96.     out[1] = in[1];
  97.     out[2] = in[2];
  98. }
  99.  
  100. void _VectorScale (vec3_t v, vec_t scale, vec3_t out)
  101. {
  102.     out[0] = v[0] * scale;
  103.     out[1] = v[1] * scale;
  104.     out[2] = v[2] * scale;
  105. }
  106.  
  107. vec_t VectorNormalize (vec3_t v)
  108. {
  109.     int        i;
  110.     double    length;
  111.  
  112. if ( fabs(v[1] - 0.000215956) < 0.0001)
  113. i=1;
  114.  
  115.     length = 0;
  116.     for (i=0 ; i< 3 ; i++)
  117.         length += v[i]*v[i];
  118.     length = sqrt (length);
  119.     if (length == 0)
  120.         return 0;
  121.         
  122.     for (i=0 ; i< 3 ; i++)
  123.         v[i] /= length;    
  124.  
  125.     return length;
  126. }
  127.  
  128. void VectorInverse (vec3_t v)
  129. {
  130.     v[0] = -v[0];
  131.     v[1] = -v[1];
  132.     v[2] = -v[2];
  133. }
  134.  
  135. void ClearBounds (vec3_t mins, vec3_t maxs)
  136. {
  137.     mins[0] = mins[1] = mins[2] = 99999;
  138.     maxs[0] = maxs[1] = maxs[2] = -99999;
  139. }
  140.  
  141. void AddPointToBounds (vec3_t v, vec3_t mins, vec3_t maxs)
  142. {
  143.     int        i;
  144.     vec_t    val;
  145.  
  146.     for (i=0 ; i<3 ; i++)
  147.     {
  148.         val = v[i];
  149.         if (val < mins[i])
  150.             mins[i] = val;
  151.         if (val > maxs[i])
  152.             maxs[i] = val;
  153.     }
  154. }
  155.  
  156.  
  157. void AngleMatrix (const vec3_t angles, float (*matrix)[4] )
  158. {
  159.     float        angle;
  160.     float        sr, sp, sy, cr, cp, cy;
  161.     
  162.     angle = angles[2] * (Q_PI*2 / 360);
  163.     sy = sin(angle);
  164.     cy = cos(angle);
  165.     angle = angles[1] * (Q_PI*2 / 360);
  166.     sp = sin(angle);
  167.     cp = cos(angle);
  168.     angle = angles[0] * (Q_PI*2 / 360);
  169.     sr = sin(angle);
  170.     cr = cos(angle);
  171.  
  172.     // matrix = (Z * Y) * X
  173.     matrix[0][0] = cp*cy;
  174.     matrix[1][0] = cp*sy;
  175.     matrix[2][0] = -sp;
  176.     matrix[0][1] = sr*sp*cy+cr*-sy;
  177.     matrix[1][1] = sr*sp*sy+cr*cy;
  178.     matrix[2][1] = sr*cp;
  179.     matrix[0][2] = (cr*sp*cy+-sr*-sy);
  180.     matrix[1][2] = (cr*sp*sy+-sr*cy);
  181.     matrix[2][2] = cr*cp;
  182.     matrix[0][3] = 0.0;
  183.     matrix[1][3] = 0.0;
  184.     matrix[2][3] = 0.0;
  185. }
  186.  
  187. void AngleIMatrix (const vec3_t angles, float matrix[3][4] )
  188. {
  189.     float        angle;
  190.     float        sr, sp, sy, cr, cp, cy;
  191.     
  192.     angle = angles[2] * (Q_PI*2 / 360);
  193.     sy = sin(angle);
  194.     cy = cos(angle);
  195.     angle = angles[1] * (Q_PI*2 / 360);
  196.     sp = sin(angle);
  197.     cp = cos(angle);
  198.     angle = angles[0] * (Q_PI*2 / 360);
  199.     sr = sin(angle);
  200.     cr = cos(angle);
  201.  
  202.     // matrix = (Z * Y) * X
  203.     matrix[0][0] = cp*cy;
  204.     matrix[0][1] = cp*sy;
  205.     matrix[0][2] = -sp;
  206.     matrix[1][0] = sr*sp*cy+cr*-sy;
  207.     matrix[1][1] = sr*sp*sy+cr*cy;
  208.     matrix[1][2] = sr*cp;
  209.     matrix[2][0] = (cr*sp*cy+-sr*-sy);
  210.     matrix[2][1] = (cr*sp*sy+-sr*cy);
  211.     matrix[2][2] = cr*cp;
  212.     matrix[0][3] = 0.0;
  213.     matrix[1][3] = 0.0;
  214.     matrix[2][3] = 0.0;
  215. }
  216.  
  217. void R_ConcatTransforms (float in1[3][4], float in2[3][4], float out[3][4])
  218. {
  219.     out[0][0] = in1[0][0] * in2[0][0] + in1[0][1] * in2[1][0] +
  220.                 in1[0][2] * in2[2][0];
  221.     out[0][1] = in1[0][0] * in2[0][1] + in1[0][1] * in2[1][1] +
  222.                 in1[0][2] * in2[2][1];
  223.     out[0][2] = in1[0][0] * in2[0][2] + in1[0][1] * in2[1][2] +
  224.                 in1[0][2] * in2[2][2];
  225.     out[0][3] = in1[0][0] * in2[0][3] + in1[0][1] * in2[1][3] +
  226.                 in1[0][2] * in2[2][3] + in1[0][3];
  227.     out[1][0] = in1[1][0] * in2[0][0] + in1[1][1] * in2[1][0] +
  228.                 in1[1][2] * in2[2][0];
  229.     out[1][1] = in1[1][0] * in2[0][1] + in1[1][1] * in2[1][1] +
  230.                 in1[1][2] * in2[2][1];
  231.     out[1][2] = in1[1][0] * in2[0][2] + in1[1][1] * in2[1][2] +
  232.                 in1[1][2] * in2[2][2];
  233.     out[1][3] = in1[1][0] * in2[0][3] + in1[1][1] * in2[1][3] +
  234.                 in1[1][2] * in2[2][3] + in1[1][3];
  235.     out[2][0] = in1[2][0] * in2[0][0] + in1[2][1] * in2[1][0] +
  236.                 in1[2][2] * in2[2][0];
  237.     out[2][1] = in1[2][0] * in2[0][1] + in1[2][1] * in2[1][1] +
  238.                 in1[2][2] * in2[2][1];
  239.     out[2][2] = in1[2][0] * in2[0][2] + in1[2][1] * in2[1][2] +
  240.                 in1[2][2] * in2[2][2];
  241.     out[2][3] = in1[2][0] * in2[0][3] + in1[2][1] * in2[1][3] +
  242.                 in1[2][2] * in2[2][3] + in1[2][3];
  243. }
  244.